﻿using System;
using System.Data;
using System.Data.SqlClient;
using System.Globalization;
using System.Windows.Forms;
using System.Collections.Generic;
using System.Net;
using System.Net.Cache;
using System.IO;
using System.Text;
using System.Text.RegularExpressions;
using System.Security.Cryptography;
using System.Management;
using DevExpress.XtraEditors;
using System.Net.Sockets;

namespace prjKQXS_DLL
{
    public static class clsCommon
    {
        //Cài đặt event OnError để bắt các lỗi chưa được xử lý
        public delegate void OnErrorHandler(Exception e);
        public static event OnErrorHandler OnError;

        //Cài đặt event OnAction để thông báo các trạng thái kết quả
        public delegate void OnActionHandler(SqlException e);
        public static event OnActionHandler OnAction;

        // ko cho phep  doi ngay
        public static DateTime GetNistTime()
        {
            DateTime dateTime = DateTime.MinValue;

            HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://nist.time.gov/actualtime.cgi?lzbc=siqm9b");
            request.Method = "GET";
            request.Accept = "text/html, application/xhtml+xml, */*";
            request.UserAgent = "Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; Trident/6.0)";
            request.ContentType = "application/x-www-form-urlencoded";
            request.CachePolicy = new RequestCachePolicy(RequestCacheLevel.NoCacheNoStore); //No caching
            HttpWebResponse response = (HttpWebResponse)request.GetResponse();
            if (response.StatusCode == HttpStatusCode.OK)
            {
                StreamReader stream = new StreamReader(response.GetResponseStream());
                string html = stream.ReadToEnd();//<timestamp time=\"1395772696469995\" delay=\"1395772696469995\"/>
                string time = Regex.Match(html, @"(?<=\btime="")[^""]*").Value;
                double milliseconds = Convert.ToInt64(time) / 1000.0;
                dateTime = new DateTime(1970, 1, 1).AddMilliseconds(milliseconds).ToLocalTime();
            }

            return dateTime;
        }
        /// <summary>
        /// ko cho phep  doi ngay ver 1
        /// </summary>
        /// <returns>DateTime</returns>
        public static DateTime GetNistTimeNew()
        {
            var client = new TcpClient("time.nist.gov", 13);
            using (var streamReader = new StreamReader(client.GetStream()))
            {
                var response = streamReader.ReadToEnd();
                var utcDateTimeString = response.Substring(7, 17);
                var localDateTime = DateTime.ParseExact(utcDateTimeString, "yy-MM-dd HH:mm:ss", CultureInfo.InvariantCulture, DateTimeStyles.AssumeUniversal);
                return localDateTime;
            }
        }

        /// <summary>
        /// Kiểm tra xem userId có quyền functionID hay không. Nếu có trả về true, ngược lại nếu không hoặc không xác định thì trả về false.
        /// </summary>
        /// <param name="userID"></param>
        /// <param name="functionID"></param>
        /// <returns></returns>
        public static bool hasPermission(int userID, int functionID)
        {
            bool ok = true;

            SqlConnection conn = new SqlConnection(BienTc.connString);
            conn.Open();

            SqlCommand cmd = new SqlCommand("select Allow from tblUserPermission where UserID = @UserID and FunctionID = @FunctionID", conn);
            cmd.Parameters.AddWithValue("@UserID", userID);
            cmd.Parameters.AddWithValue("@FunctionID", functionID);
            object result = cmd.ExecuteScalar();
            if (result != DBNull.Value && result != null) ok = (bool)result;

            return ok;
        }

        public static string Docso(decimal number)
        {
            string s = number.ToString("#");
            string[] so = new string[] { "không", "một", "hai", "ba", "bốn", "năm", "sáu", "bẩy", "tám", "chín" };
            string[] hang = new string[] { "", "nghìn", "triệu", "tỷ" };
            int i, j, donvi, chuc, tram;
            string str = " ";
            bool booAm = false;
            decimal decS = 0;
            try
            {
                decS = Convert.ToDecimal(s.ToString());
            }
            catch
            {
            }
            if (decS < 0)
            {
                decS = -decS;
                s = decS.ToString();
                booAm = true;
            }
            i = s.Length;
            if (i == 0)
                str = so[0] + str;
            else
            {
                j = 0;
                while (i > 0)
                {
                    donvi = Convert.ToInt32(s.Substring(i - 1, 1));
                    i--;
                    if (i > 0)
                        chuc = Convert.ToInt32(s.Substring(i - 1, 1));
                    else
                        chuc = -1;
                    i--;
                    if (i > 0)
                        tram = Convert.ToInt32(s.Substring(i - 1, 1));
                    else
                        tram = -1;
                    i--;
                    if ((donvi > 0) || (chuc > 0) || (tram > 0) || (j == 3))
                        str = hang[j] + str;
                    j++;
                    if (j > 3) j = 1;
                    if ((donvi == 1) && (chuc > 1))
                        str = "một " + str;
                    else
                    {
                        if ((donvi == 5) && (chuc > 0))
                            str = "lăm " + str;
                        else if (donvi > 0)
                            str = so[donvi] + " " + str;
                    }
                    if (chuc < 0)
                        break;
                    else
                    {
                        if ((chuc == 0) && (donvi > 0)) str = "linh " + str;
                        if (chuc == 1) str = "mười " + str;
                        if (chuc > 1) str = so[chuc] + " mươi " + str;
                    }
                    if (tram < 0) break;
                    else
                    {
                        if ((tram > 0) || (chuc > 0) || (donvi > 0)) str = so[tram] + " trăm " + str;
                    }
                    str = " " + str;
                }
            }
            if (booAm) str = "Âm " + str;

            str = (str + "đồng chẵn.").Replace("  ", " ").Trim();
            str = str.Substring(0, 1).ToUpper() + str.Substring(1, str.Length - 1);
            return str;
            //textBox2.Text = Docso(Convert.ToDecimal(textBox1.Text));
        }


        /// <summary>
        /// Trả về bảng dữ liệu làm nguồn cho lueCanBo, gồm các cột ID, TEN, Ma_DT, Ten_DT.
        /// <para>Dùng trong frmDTHHTheoCB, frmDoanhThuLD, frmDOANHTHU, frmChuyen, frmDMHopDong</para>
        /// <para>Chú ý: Giá trị của cột ID ở dòng đầu tiên (tương ứng với "Tất cả") được gán bằng -1.</para>
        /// </summary>
        /// <param name="MaDV">Truyền vào '%' (tất cả đơn vị) hoặc mã đơn vị tương ứng</param>
        /// <param name="DieuKien"></param>
        /// <returns></returns>
        public static DataTable load_lueCanBo(char MaDV, string DieuKien = "")
        {
            DataTable dt = new DataTable();

            try
            {
                SqlConnection conn = new SqlConnection(BienTc.connString);
                conn.Open();

                if (MaDV == '%')
                {
                    dt.Columns.Add("ID", Type.GetType("System.Int32"));
                    dt.Columns.Add("Ten", Type.GetType("System.String"));
                    dt.Columns.Add("Ma_DT", Type.GetType("System.String"));
                    dt.Columns.Add("Ten_DT", Type.GetType("System.String"));
                }
                else
                {
                    string sql = @"select Ma_DT + ' - ' + Ten_DT as Ten, ID, Ma_DT, Ten_DT 
                                    from DMCANBO where isPublic = 1 and Ma_DMDonVi like '" + MaDV + "' " + DieuKien + " ORDER BY Ma_DT";
                    dt = clsCommon.FillData(sql);
                }

                DataRow dr = dt.NewRow();
                dr["ID"] = -1;
                dr["Ten"] = "Tất cả";
                dr["Ma_DT"] = "TC";
                dr["Ten_DT"] = "Tất cả";
                dt.Rows.InsertAt(dr, 0);
            }
            catch (SqlException e)
            {
                OnAction(e);
            }
            catch (Exception e)
            {
                OnError(e);
            }

            return dt;
        }

        /// <summary>
        /// Hàm này nạp dữ liệu cho lueDonVi, gồm các cột: Ten, Ma_DT, Ten_DT.
        /// <para>Dùng tại: frmDOANHTHU, frmDoanhThuLD</para>
        /// </summary>
        /// <returns></returns>
        public static DataTable load_lueDonVi()
        {
            DataTable dt = new DataTable();

            try
            {
                SqlConnection conn = new SqlConnection(BienTc.connString);
                conn.Open();
                dt = clsCommon.FillData("select Ma_DT + ' - ' + Ten_DT as Ten, Ma_DT, Ten_DT from DMDONVI where isPublic = 1 ORDER BY Ma_DT");
                DataRow dr = dt.NewRow();
                dr["Ten"] = "Công ty";
                dr["Ma_DT"] = "TC";
                dr["Ten_DT"] = "Công ty";
                dt.Rows.InsertAt(dr, 0);
            }
            catch (SqlException e)
            {
                OnAction(e);
            }
            catch (Exception e)
            {
                OnError(e);
            }

            return dt;
        }

        /// <summary>
        /// Chuyển số tiền sang số tiền bằng chữ.
        /// </summary>
        /// <param name="number">Số tiền</param>
        /// <returns>Số tiền bằng chữ</returns>
        public static string ConvertDecimalToString(decimal number)
        {
            string s = number.ToString("#");
            string[] so = new string[] { "không", "một", "hai", "ba", "bốn", "năm", "sáu", "bảy", "tám", "chín" };
            string[] hang = new string[] { "", "nghìn", "triệu", "tỷ" };
            int i, j, donvi, chuc, tram;
            string str = " ";
            bool booAm = false;
            decimal decS = 0;
            //Tung addnew
            try
            {
                decS = Convert.ToDecimal(s.ToString());
            }
            catch
            {
            }
            if (decS < 0)
            {
                decS = -decS;
                s = decS.ToString();
                booAm = true;
            }
            i = s.Length;
            if (i == 0)
                str = so[0] + str;
            else
            {
                j = 0;
                while (i > 0)
                {
                    donvi = Convert.ToInt32(s.Substring(i - 1, 1));
                    i--;
                    if (i > 0)
                        chuc = Convert.ToInt32(s.Substring(i - 1, 1));
                    else
                        chuc = -1;
                    i--;
                    if (i > 0)
                        tram = Convert.ToInt32(s.Substring(i - 1, 1));
                    else
                        tram = -1;
                    i--;
                    if ((donvi > 0) || (chuc > 0) || (tram > 0) || (j == 3))
                        str = hang[j] + str;
                    j++;
                    if (j > 3) j = 1;
                    if ((donvi == 1) && (chuc > 1))
                        str = "một " + str;
                    else
                    {
                        if ((donvi == 5) && (chuc > 0))
                            str = "lăm " + str;
                        else if (donvi > 0)
                            str = so[donvi] + " " + str;
                    }
                    if (chuc < 0)
                        break;
                    else
                    {
                        if ((chuc == 0) && (donvi > 0)) str = "linh " + str;
                        if (chuc == 1) str = "mười " + str;
                        if (chuc > 1) str = so[chuc] + " mươi " + str;
                    }
                    if (tram < 0) break;
                    else
                    {
                        if ((tram > 0) || (chuc > 0) || (donvi > 0)) str = so[tram] + " trăm " + str;
                    }
                    str = " " + str;
                }
            }
            if (booAm) str = "Âm " + str;

            str = (str + "đồng chẵn.").Replace("  ", " ").Trim();
            str = str.Substring(0, 1).ToUpper() + str.Substring(1, str.Length - 1);

            return str;
        }

        public static string formatNumber(decimal number, string para)
        {
            string config = "";
            config = para;
            if (config == "") config = "###,##0";
            config += "}";
            config = "{0:" + config;
            string s = String.Format(config, number);
            if (s == "Input string was not in a correct format.")
            {
                s = string.Format("{0:0,0.0}", number);
                return s;
            }
            else
            {
                return s;
            }

        }

        /// <summary>
        /// Load data to LookUpEdit  
        /// 
        /// Tablename,Display,Value,Index 
        /// </summary>
        /// <param name="lueNhomDT"></param>
        /// <param name="tableName"></param>
        /// <param name="DisplayMember"></param>
        /// <param name="ValueMember"></param>
        /// <param name="index"></param>
        public static void loadData2Cbb(LookUpEdit lueNhomDT, string tableName, string DisplayMember, string ValueMember)
        {
            try
            {
                NhomVT_DAL nhomvt_dal = new NhomVT_DAL();
                lueNhomDT.Properties.DataSource = null;
                if (clsCommon.TableExisted(tableName))
                {
                    DataTable dt = new DataTable();
                    dt = nhomvt_dal.loadDataList(tableName, true);
                    DataRow row = dt.NewRow();
                    row[DisplayMember] = "Tất cả";
                    row[ValueMember] = "TC";
                    dt.Rows.InsertAt(row, 0);
                    lueNhomDT.Properties.DataSource = dt;
                    if (dt.Rows.Count > 0)
                    {
                        lueNhomDT.ItemIndex = 0;
                    }
                }
            }
            catch (Exception ex)
            {
                clsCommon.MsgBox(ex.Message.ToString(), 1);
            }
        }

        /// <summary>
        /// Mã hóa MD5
        /// </summary>
        /// <param name="toEncrypt"></param>
        /// <param name="key"></param>
        /// <param name="useHashing"></param>
        /// <returns></returns>
        public static string Encrypt(string toEncrypt, string key, bool useHashing)
        {
            byte[] keyArray;
            byte[] toEncryptArray = UTF8Encoding.UTF8.GetBytes(toEncrypt);

            if (useHashing)
            {
                MD5CryptoServiceProvider hashmd5 = new MD5CryptoServiceProvider();
                keyArray = hashmd5.ComputeHash(UTF8Encoding.UTF8.GetBytes(key));
            }
            else
                keyArray = UTF8Encoding.UTF8.GetBytes(key);

            TripleDESCryptoServiceProvider tdes = new TripleDESCryptoServiceProvider();
            tdes.Key = keyArray;
            tdes.Mode = CipherMode.ECB;
            tdes.Padding = PaddingMode.PKCS7;

            ICryptoTransform cTransform = tdes.CreateEncryptor();
            byte[] resultArray = cTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length);

            return Convert.ToBase64String(resultArray, 0, resultArray.Length);
        }

        /// <summary>
        /// Giả mã MD5
        /// </summary>
        /// <param name="toDecrypt"></param>
        /// <param name="key"></param>
        /// <param name="useHashing"></param>
        /// <returns></returns>
        public static string Decrypt(string toDecrypt, string key, bool useHashing)
        {
            try
            {
                byte[] keyArray;
                byte[] toEncryptArray = Convert.FromBase64String(toDecrypt);

                if (useHashing)
                {
                    MD5CryptoServiceProvider hashmd5 = new MD5CryptoServiceProvider();
                    keyArray = hashmd5.ComputeHash(UTF8Encoding.UTF8.GetBytes(key));
                }
                else
                    keyArray = UTF8Encoding.UTF8.GetBytes(key);

                TripleDESCryptoServiceProvider tdes = new TripleDESCryptoServiceProvider();
                tdes.Key = keyArray;
                tdes.Mode = CipherMode.ECB;
                tdes.Padding = PaddingMode.PKCS7;

                ICryptoTransform cTransform = tdes.CreateDecryptor();
                byte[] resultArray = cTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length);

                return UTF8Encoding.UTF8.GetString(resultArray);
            }
            catch
            {
                return "";
            }
        }


        /// <summary>
        /// num :giá trị cần chuyển đổi |      
        /// [type: 0 -integer] |
        /// [type: 1 -float] |
        /// [type: 2 -double] | 
        /// [type: 3 -decimal] |
        /// [type: 4 -Datetime] 
        /// </summary>        
        /// <returns></returns>

        public static int Layindexhang(int vitri, int sohang)
        {
            if (vitri > sohang)
            {
                return vitri - 1;
            }
            else
            {
                if (sohang == 0)
                {
                    return 0;
                }
                else
                {
                    return vitri;
                }
            }
        }

        public static void deleteMultiRestoreRow(string tableName, string key, string keyValue, bool isPublic, bool isKhoiphuc, SqlConnection sqlconn)
        {
            //try
            //{
            SqlCommand cmd = null;
            if (sqlconn.State != ConnectionState.Open)
            {
                sqlconn.Open();
            }

            if (isKhoiphuc.Equals(true))
            {
                cmd = new SqlCommand("Delete From [" + tableName + "] where " + key + " = @value", sqlconn);
                cmd.Parameters.AddWithValue("@value", keyValue);
                cmd.ExecuteScalar();
            }
            else
            {
                if (isPublic == true)
                {
                    cmd = new SqlCommand("update [" + tableName + "] set isPublic = 1 where " + key + " = @value", sqlconn);
                }
                else
                {
                    cmd = new SqlCommand("update [" + tableName + "] set isPublic = 0 where " + key + " = @value", sqlconn);
                }
                cmd.Parameters.AddWithValue("@value", keyValue);
                cmd.ExecuteScalar();
            }

            //}
            //catch (Exception ex)
            //{
            //    throw ex;
            //}
            //finally
            //{
            sqlconn.Close();
            //}
        }

        /// <summary>
        /// Hien thi Form Input tra ve string
        /// </summary>
        /// <param name="frmCaption"></param>
        /// <param name="label"></param>
        /// <param name="button"></param>
        /// <param name="textbox"></param>
        /// <returns></returns>
      public static string NhapSL(string frmCaption, string label, string button, string textbox, Boolean isPwd)
        {

            frmNhapSL frm = new frmNhapSL(frmCaption, label, button, textbox, isPwd);
            frm.ShowDialog();
            return frm.retVal;
        }

        public static string NhapSL(string frmname, string frmCaption, string label, string button, string textbox, Boolean isPwd)
        {
            frmNhapSL frm = new frmNhapSL(frmname, frmCaption, label, button, textbox, isPwd);
            frm.ShowDialog();
            return frm.retVal;
        }

        /// <summary>
        /// Sao lưu dữ liệu
        /// </summary>
        public static void autoBackup()
        {
            string BackupFolder = @"D:\Backup";

            string computerName = getComputerName();
            //Cat chuoi connection
            string[] s = BienTc.connString.Split(';');
            string dataSource = "";
            foreach (string ss in s)
            {
                if (ss.Trim().Contains("Data Source"))
                    dataSource = ss.Split('=')[1].ToString();
            }
            
            //Tao thu muc backup
            if (dataSource.Trim().ToUpper().Contains(computerName.ToUpper()))
            {
                if (!Directory.Exists(BackupFolder))
                    Directory.CreateDirectory(BackupFolder);
            }

            //Kiem tra thoi gian
            bool isHaveColumn = false;
            SqlConnection conn = new SqlConnection(BienTc.connString);
            conn.Open();
            SqlCommand cmd = new SqlCommand("select * from information_schema.columns where TABLE_NAME = 'DONVI' and COLUMN_NAME = 'backuptime'", conn);
            SqlDataReader dr = cmd.ExecuteReader();
            if (dr.Read())isHaveColumn = true;
            dr.Dispose();
            if (!isHaveColumn)
            {
                cmd = new SqlCommand("alter table DONVI add backuptime Datetime null", conn);
                cmd.ExecuteNonQuery();

                cmd = new SqlCommand("update DONVI set backuptime = @but", conn);
                cmd.Parameters.AddWithValue("@but", DateTime.Now.Subtract(new TimeSpan(1, 1, 1, 1)));
                cmd.ExecuteNonQuery();
            }

            cmd = new SqlCommand("select backuptime from DONVI", conn);
            dr = cmd.ExecuteReader();
            DateTime backupTime = DateTime.Now;
            if (dr.Read())backupTime = dr.GetDateTime(0);
            dr.Dispose();

            if (backupTime.Date != DateTime.Now.Date)
            {
                string fileBackUp = @"D:\Backup\" + conn.Database + "_" + DateTime.Now.DayOfWeek + ".bak";
                CSDL.clsDatabase cls = new CSDL.clsDatabase();
                cls.OnMyPercentComplete += new CSDL.clsDatabase.MyPercentCompleteEventHandler((percent) => {});
                cls.onOtherException += new CSDL.clsDatabase.OnErrorHandler((exception) => { });
                cls.backupKQXS(fileBackUp);
                cmd = new SqlCommand("update DONVI set backuptime = @but", conn);
                cmd.Parameters.AddWithValue("@but", DateTime.Now);
                cmd.ExecuteNonQuery();
                conn.Close();
            }
        }

        public static string getComputerName()
        {
            ManagementClass mc = new ManagementClass("Win32_ComputerSystem");
            ManagementObjectCollection moc = mc.GetInstances();
            string s = "";
            foreach (ManagementObject mo in moc)
            {
                s = mo.Properties["Name"].Value.ToString();
            }
            return s;
        }


        /// <summary>
        /// Hàm này kiểm tra xem một bảng có tồn tại trong csdl hay không.
        /// </summary>
        /// <param name="tableName">Tên bảng cần kiểm tra</param>
        /// <returns></returns>
        public static Boolean TableExisted(string tableName)
        {
            Boolean result = true;
            SqlConnection conn = new SqlConnection(BienTc.connString);
            conn.Open();
            SqlCommand comm = new SqlCommand("select count(*) from sys.tables where name = @name ", conn);
            comm.Parameters.AddWithValue("@name", tableName);
            if (((int)clsCommon.Parse(comm.ExecuteScalar().ToString(), 0)) > 0)
                result = true;
            else result = false;

            return result;
        }

        /// <summary>
        /// Lay cau hinh may chu dùng để insert dữ liệu
        /// </summary>
        /// <returns></returns>
        public static string getServerConnectionString()
        {
            string retVal = "";

            SqlConnection conn = new SqlConnection(BienTc.connString);
            conn.Open();

            SqlCommand cmd = new SqlCommand("select * from SERVERCONFIG", conn);
            SqlDataReader dr = cmd.ExecuteReader();
            if (dr.Read())
            {
                retVal = "Data Source=" + dr["Server"] +
                    ";Initial Catalog=" + dr["DbName"] +
                    ";User Id=" + dr["Username"] +
                    ";Password=" + dr["Password"] + ";";
            }
            else
            {
                clsCommon.MsgBox("Chưa cấu hình server!", 0);
                frmServerCfg frm = new frmServerCfg();
                frm.ShowDialog();
                retVal = getServerConnectionString();
            }

            return retVal;
        }

        //Dùng tại frmNhapVeHuy_CB,...
        public static int updateRowValue(string table, string column, string condition, object value)
        {
            SqlConnection conn = new SqlConnection(BienTc.connString);
            try
            {
                conn.Open();
                SqlCommand cmd = new SqlCommand("UPDATE " + table + " SET " + column + " = @value  " + condition, conn);
                cmd.Parameters.AddWithValue("@value", value);
                return cmd.ExecuteNonQuery();
            }
            catch (SqlException ex)
            {
                if (ex.Number == 2627)
                {
                    if (column.ToUpper().Equals("MA_DT") || column.ToUpper().Equals("MA_VT") || column.ToUpper().Equals("MA_NHOM"))
                        clsCommon.MsgBox("Mã đối tượng " + value + " đã tồn tại, vui lòng kiểm tra lại !\n", 0);
                    else
                        clsCommon.MsgBox("Đối tượng đã tồn tại, vui lòng kiểm tra lại !\n", 0);

                }
                else if (ex.Number == 8152)
                    clsCommon.MsgBox("Độ dài vượt quá giới hạn cho phép !", 0);
                else
                    clsCommon.MsgBox("Có lỗi xảy ra, vui lòng kiểm tra lại !\n" + ex.Message, 0);

                return 0;
            }
            catch
            {
                return 0;
            }
        }
        public static int deleteRowValue(string table,string Primarykey, object PrimarykeyValue)
        {
            SqlConnection conn = new SqlConnection(BienTc.connString);
            try
            {
                conn.Open();
                SqlCommand cmd = new SqlCommand("DELETE FROM  " + table + " WHere " + Primarykey + " = @value  " , conn);
                cmd.Parameters.AddWithValue("@value", PrimarykeyValue);
                return cmd.ExecuteNonQuery();
            }
            catch (SqlException ex)
            {
                clsCommon.MsgBox("Có lỗi xảy ra, vui lòng kiểm tra lại !\n" + ex.Message, 0);

                return 0;
            }
            catch
            {
                return 0;
            }
        }

        public static int updatequy(string table, string column, string condition, object value)
        {
            try
            {
                SqlConnection conn = new SqlConnection(BienTc.connString);
                try
                {
                    conn.Open();
                    SqlCommand cmd = new SqlCommand("UPDATE " + table + " SET " + column + " = @value " + condition, conn);
                    cmd.Parameters.AddWithValue("@value", value);
                    return cmd.ExecuteNonQuery();
                }
                catch (SqlException ex)
                {
                    clsCommon.MsgBox("Có lỗi xảy ra, vui lòng kiểm tra lại !\n" + ex.Message, 0);
                    return 0;
                }
            }
            catch
            {
                return 0;
            }
        }

        public static int ExecuteQuery(string query)
        {
            SqlConnection conn = new SqlConnection(BienTc.connString);
            conn.Open();
            SqlCommand sqlCommand = new SqlCommand(query, conn);
            return sqlCommand.ExecuteNonQuery();
        }

        public static int deleteRestoreRow(string tableName, string condition)
        {
            SqlConnection sqlconn = new SqlConnection(BienTc.connString);
            sqlconn.Open();
            SqlCommand cmd = new SqlCommand("update " + tableName + " set isPublic=0 " + condition, sqlconn);
            return cmd.ExecuteNonQuery();
        }

        public static int deleteRestoreRow(string tableName, string condition, bool isPublic)
        {
            SqlConnection sqlconn = new SqlConnection(BienTc.connString);
            SqlCommand cmd;
            sqlconn.Open();
            if (isPublic == true)
                cmd = new SqlCommand("update [" + tableName + "] set isPublic = 1 " + condition, sqlconn);
            else
                cmd = new SqlCommand("update [" + tableName + "] set isPublic = 0 " + condition, sqlconn);

            return cmd.ExecuteNonQuery();
        }

        public static int deleteRestoreRow(string tableName, string key, string keyValue, bool isPublic, bool isKhoiphuc)
        {
            SqlConnection sqlconn = new SqlConnection(BienTc.connString);
            try
            {
                SqlCommand cmd = null;
                sqlconn.Open();
                if (isKhoiphuc.Equals(true))
                {
                    if (XtraMessageBox.Show("Ở trong chế độ khôi phục sẽ xóa dòng này khỏi CSDL vĩnh viễn, Có đồng ý xóa không?", "Thông báo: ", MessageBoxButtons.YesNo, MessageBoxIcon.Exclamation) == DialogResult.Yes)
                    {
                        cmd = new SqlCommand("Delete From [" + tableName + "] where " + key + " = @value", sqlconn);
                        cmd.Parameters.AddWithValue("@value", keyValue);
                        if (sqlconn.State == ConnectionState.Closed)
                            sqlconn.Open();

                        return cmd.ExecuteNonQuery();
                    }
                    else
                        return 0;
                }
                else
                {
                    if (isPublic == true)
                    {
                        if (XtraMessageBox.Show("Bạn có chắc chắn muốn khôi phục dòng này?", "Thông báo : ", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes)
                            cmd = new SqlCommand("update [" + tableName + "] set isPublic = 1 where " + key + " = @value", sqlconn);
                        else return 0;
                    }
                    else
                    {
                        if (XtraMessageBox.Show("Bạn có chắc chắn muốn xoá dòng này?", "Thông báo : ", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes)
                            cmd = new SqlCommand("update [" + tableName + "] set isPublic = 0 where " + key + " = @value", sqlconn);
                        else return 0;
                    }
                    if (sqlconn.State == ConnectionState.Closed)sqlconn.Open();
                    cmd.Parameters.AddWithValue("@value", keyValue);
                    return cmd.ExecuteNonQuery();
                }

            }
            catch
            {
                return 0;
            }
        }

        /// <summary>
        /// Trả về object, giá trị của cột
        /// </summary>
        /// <param name="tableName"></param>
        /// <param name="tenCot"></param>
        /// <returns></returns>
        public static object getCellValue(string tableName, string tenCot, string dieukien)
        {
            try
            {
                SqlConnection conn = new SqlConnection(BienTc.connString);
                conn.Open();
                SqlCommand cmd = new SqlCommand("select " + tenCot.Trim() + " from " + tableName.Trim() + " " + dieukien, conn);
                return cmd.ExecuteScalar();
            }
            catch (Exception)
            {
                return 0;
            }
        }

        public static string laymadt(string tableName, string madt, int dodai)
        {
            string ma_dt = "00001";
            SqlConnection sqlconn = new SqlConnection(BienTc.connString);
            try
            {
                sqlconn.Open();

                SqlCommand comm = new SqlCommand("select MAX(" + madt + ") from [" + tableName + "]", sqlconn);
                int id = 0;
                int do_lon = 0;
                //try
                //{
                string ma = comm.ExecuteScalar().ToString();
                do_lon = ma.Length;
                string ma_moi = "";
                foreach (Char c in ma)
                {
                    if (!Char.IsDigit(c))
                        ma_moi = ma_moi + c;
                }
                string ma_kt = ma.Substring(ma_moi.Length, ma.Length - ma_moi.Length);
                id = (int)clsCommon.Parse(ma_kt, 0) + 1;
                int ghep = do_lon - ma_moi.Length - id.ToString().Length;
                ma_dt = ma_moi + id.ToString().PadLeft(ghep + 1, '0');

                SqlDataAdapter da = new SqlDataAdapter("select " + madt + " from [" + tableName + "]", sqlconn);
                DataTable dtTrung = new DataTable();
                da.Fill(dtTrung);
                bool checkNe = true;
                if (dtTrung.Rows.Count > 0)
                {

                    while (checkNe)
                    {
                        foreach (DataRow dr in dtTrung.Rows)
                        {
                            if (dr[0].ToString().Equals(ma_dt))
                            {
                                id++;
                                ma_dt = ma_moi + id.ToString().PadLeft(ghep + 1, '0');
                                checkNe = true;
                                break;
                            }
                            else checkNe = false;
                        }
                    }
                }
                else ma_dt = "00001";
                
                return ma_dt;
            }
            catch
            {
                return ma_dt;
            }
        }

        public static DataTable loadDataTable(string Qry)
        {
            SqlConnection sqlconn = new SqlConnection(BienTc.connString);
            sqlconn.Open();
            SqlCommand comm = new SqlCommand(Qry, sqlconn);
            SqlDataAdapter adapter = new SqlDataAdapter(comm);
            DataTable dt = new DataTable();
            adapter.Fill(dt);
            return dt;
        }

        public static DataTable loadDataTable(string Qry, SqlConnection sqlconn)
        {
            if (sqlconn.State == ConnectionState.Closed)sqlconn.Open();
            SqlCommand comm = new SqlCommand(Qry, sqlconn);
            SqlDataAdapter adapter = new SqlDataAdapter(comm);
            DataTable dt = new DataTable();
            adapter.Fill(dt);
            return dt;
        }

        /// <summary>
        /// <para>Trả về ngày tháng cuối cùng của tháng/năm nhập vào.</para>
        /// <para>Dùng tại rptTongHopDaiLyCTy, rptBienDongDaiLy, frmBaoCao</para>
        /// </summary>
        /// <param name="year">Năm</param>
        /// <param name="month">Tháng</param>
        /// <returns></returns>
        public static DateTime maxNgay(int year, int month)
        {
            if (month == 0)
                month = 1;
            return new DateTime(year, month, DateTime.DaysInMonth(year, month));
        }

        ///<summary>
        ///<para name="type">
        ///<para>Type 0 : OK - Error</para>
        ///<para>Type 1 : OK - Information</para>
        ///<para>Type 2 : YesNo - Information</para>
        ///<para>Type 3 : YesNoCancel - Information</para>
        ///<para>Type 4 : YesNo - Warning</para>
        ///<para>Type 5 : OK - Warning</para>
        ///<para>Type 6 : YesNo - Question</para>
        /// </para>
        ///</summary>
        public static DialogResult MsgBox(string message, int type)
        {
            string s = "KQXS";

            MessageBoxIcon msgIcon = MessageBoxIcon.None;
            switch (type)
            {
                case 0: msgIcon = MessageBoxIcon.Error; break;
                case 1:
                case 2:
                case 3: msgIcon = MessageBoxIcon.Information; break;
                case 4:
                case 5: msgIcon = MessageBoxIcon.Warning; break;
                case 6: msgIcon = MessageBoxIcon.Question; break;
            }

            //if (type == 0) msgIcon = MessageBoxIcon.Error;
            //else if (type == 1) msgIcon = MessageBoxIcon.Information;
            //else if (type == 2) msgIcon = MessageBoxIcon.Information;
            //else if (type == 3) msgIcon = MessageBoxIcon.Information;
            //else if (type == 4) msgIcon = MessageBoxIcon.Warning;
            //else if (type == 5) msgIcon = MessageBoxIcon.Warning;
            //else if (type == 6) msgIcon = MessageBoxIcon.Question;

            try
            {
                if (type == 0)return XtraMessageBox.Show(message, s, MessageBoxButtons.OK, msgIcon);
                else if (type == 1)return XtraMessageBox.Show(message, s, MessageBoxButtons.OK, msgIcon);
                else if (type == 2)return XtraMessageBox.Show(message, s, MessageBoxButtons.YesNo, msgIcon);
                else if (type == 3) return XtraMessageBox.Show(message, s, MessageBoxButtons.YesNoCancel, msgIcon);
                else if (type == 4)return XtraMessageBox.Show(message, s, MessageBoxButtons.YesNo, msgIcon);
                else if (type == 5) return XtraMessageBox.Show(message, s, MessageBoxButtons.OK, msgIcon);
                else if (type == 6) return XtraMessageBox.Show(message, s, MessageBoxButtons.YesNo, msgIcon);
                else return DialogResult.OK;
            }
            catch
            {
                return DialogResult.Cancel;
            }

        }

        /// <summary>
        /// Hàm trả về một số decimal từ object truyền vào. Dùng trong clsDoanhThu
        /// </summary>
        /// <param name="o"></param>
        /// <returns></returns>
        public static decimal getDecimal(object o)
        {
            decimal d = 0;

            if (o != null) d = !string.IsNullOrEmpty(o.ToString().Trim()) ? Convert.ToDecimal(o) : 0;

            return d;
        }

        public static object Parse(string num, int type)
        {
            object number = null;
            switch (type)
            {
                case 0:
                    int typeInt;
                    if (Int32.TryParse(num, out typeInt)) number = typeInt;
                    else number = 0;
                    break;
                case 1:
                    float typeFloat;
                    if (float.TryParse(num, out typeFloat)) number = typeFloat;
                    else number = 0;
                    break;
                case 2:
                    double typeDouble;
                    if (double.TryParse(num, out typeDouble)) number = typeDouble;
                    else number = 0.0;
                    break;
                case 3:
                    decimal typeDecimal;
                    if (decimal.TryParse(num, out typeDecimal)) number = typeDecimal;
                    else number = 0.0M;
                    break;
                case 4:
                    if (!num.Trim().Equals(""))
                    {
                        int typeArr;
                        string[] arr = num.Split('/');
                        if (!arr[0].Contains("0"))
                        {
                            if (int.TryParse(arr[0], out typeArr))
                                if (typeArr < 10) arr[0] = "0" + arr[0];
                        } 
                        
                        if (!arr[1].Contains("0"))
                        {
                            if (int.TryParse(arr[1], out typeArr))
                                if (typeArr < 10) arr[1] = "0" + arr[1];
                        }
                        DateTime typeDateTime;
                        num = arr[0] + "/" + arr[1] + "/" + arr[2].Trim().Split(' ')[0].Trim();
                        string dtFormat = string.Format("dd/MM/yyyy");

                        if (DateTime.TryParseExact(num, dtFormat, CultureInfo.InvariantCulture, DateTimeStyles.None, out typeDateTime))
                            number = typeDateTime;
                        else
                        {
                            MsgBox("Sai định dạng : dd/MM/yyyy (d: ngày - M: tháng -y:năm)", 0);
                            number = DateTime.Now;
                        } 
                    }
                    else number = DateTime.Now;
                    break;
                default:
                    number = 0;
                    MsgBox("Không thể chuyển giá trị truyền vào ", 0);
                    break;
            }

            return number;
        }

        
        /// <summary>
        /// Dùng thay cho phương thức Fill của DataAdapter trong trường hợp câu lệnh sql đơn giản không có tham số
        /// </summary>
        /// <param name="commandText">Chuỗi sql cần thực hiện</param>
        /// <param name="connection"></param>
        /// <returns>Bảng dữ liệu kết quả của câu lệnh sql đã truyền vào</returns>
        public static DataTable FillData(string commandText, SqlConnection connection = null)
        {
            DataTable dt = new DataTable();

            try
            {
                if (clsLicense.checkLicense())
                {
                    SqlConnection conn;
                    if (connection == null) conn = new SqlConnection(BienTc.connString);
                    else conn = connection;

                    if (conn.State == ConnectionState.Closed) conn.Open();
                    SqlDataAdapter da = new SqlDataAdapter(commandText, conn);
                    int result = da.Fill(dt);
                    conn.Close();
                }
            }
            catch (SqlException e)
            {
                OnAction(e);
            }
            catch (Exception e)
            {
                OnError(e);
            }

            return dt;
        }

        //Dùng trong các form frmDanhMucDLTCCap1, frmDanhMucDLTCCap2, frmTLDaiLy, frmMain
        public static DateTime generateNgayTLKyTiep(int cap, int id)
        {
            DateTime NgayTLKyTiep = new DateTime();

            if (clsLicense.checkLicense())
            {
                SqlConnection conn = new SqlConnection(BienTc.connString);
                conn.Open();

                //Lấy ra ngày bắt đầu tính lãi lưu vào biến DateTime NgayBDTL
                DateTime NgayBDTL = generateNgayBDTL(cap, id);

                //Lấy ra thông tin LoaiKyHan tất cả các kỳ của mã ID
                string sql = "";
                if (cap == 1) sql = "SELECT LoaiKyHan FROM TLLX1 WHERE DMCanBoID=" + id + " ORDER BY Ky";
                else sql = "SELECT LoaiKyHan FROM TLLX2 WHERE HopDongID=" + id + " ORDER BY Ky";

                SqlDataAdapter da = new SqlDataAdapter(sql, conn);
                DataTable dt = new DataTable();
                da.Fill(dt);

                if (dt.Rows.Count > 0)
                {
                    DateTime TuNgay = new DateTime();
                    DateTime DenNgay = new DateTime();

                    for (int i = 0; i < dt.Rows.Count; i++)
                    {
                        if (i == 0) TuNgay = NgayBDTL;
                        else TuNgay = DenNgay;
                        DenNgay = generateDenNgay(Convert.ToInt32(dt.Rows[i]["LoaiKyHan"]), TuNgay);
                    }

                    NgayTLKyTiep = DenNgay;
                }
            }

            return NgayTLKyTiep.Date;
        }

        public static DateTime generateDenNgay(int LoaiKyHan, DateTime TuNgay)
        {
            DateTime DenNgay = new DateTime();

            if (clsLicense.checkLicense())
            {
                if (TuNgay.Month + LoaiKyHan > 12) DenNgay = new DateTime(TuNgay.Year + 1, TuNgay.Month + LoaiKyHan - 12, 1);
                else DenNgay = new DateTime(TuNgay.Year, TuNgay.Month + LoaiKyHan, 1);
            }

            return DenNgay;
        }


        #region generateNgayBDTL (2 overload) =========================================================
        public static DateTime generateNgayBDTL(DateTime NgayNopTC)
        {
            DateTime NgayBD = new DateTime();

            if (clsLicense.checkLicense())
            {
                if (NgayNopTC.Month != 12) NgayBD = new DateTime(NgayNopTC.Year, NgayNopTC.Month + 1, 1);
                else NgayBD = new DateTime(NgayNopTC.Year + 1, 1, 1);
            }

            return NgayBD;
        }

        public static DateTime generateNgayBDTL(int cap, int id)
        {
            DateTime NgayBDTL = new DateTime();

            if (clsLicense.checkLicense())
            {
                SqlConnection conn = new SqlConnection(BienTc.connString);
                conn.Open();

                string sql = "";
                if (cap == 1) sql = "SELECT NgayNopTC FROM LAIXUAT_CB WHERE DMCanBoID=" + id;
                else sql = "SELECT NgayNopTC FROM LAIXUAT_DL WHERE HopDongID=" + id;

                SqlCommand cmd = new SqlCommand(sql, conn);
                DateTime NgayNopTC = (DateTime)(cmd.ExecuteScalar());

                if (NgayNopTC.Month != 12) NgayBDTL = new DateTime(NgayNopTC.Year, NgayNopTC.Month + 1, 1);
                else NgayBDTL = new DateTime(NgayNopTC.Year + 1, 1, 1);
            }

            return NgayBDTL;
        }
        #endregion =====================================================================================

        public static DateTime generateNgayHenRutTC(DateTime NgayThanhLy)
        {
            return NgayThanhLy.AddDays(30);
        }

        //Hàm này lấy ra ngày rút thế chấp trong csdl, nếu không có thì trả về new DateTime()
        public static DateTime getNgayRutTC(int cap, int id)
        {
            object result = null;

            if (clsLicense.checkLicense())
            {
                SqlConnection conn = new SqlConnection(BienTc.connString);
                SqlCommand cmd = new SqlCommand("proc_getNgayThanhLy_NgayRutTC", conn);
                cmd.CommandType = CommandType.StoredProcedure;
                cmd.Parameters.AddWithValue("@fieldName", "NgayRutTC");
                cmd.Parameters.AddWithValue("@Cap", cap);
                cmd.Parameters.AddWithValue("@ID", id);
                conn.Open();
                result = cmd.ExecuteScalar();
            }

            if (result == DBNull.Value) return new DateTime();
            else return (DateTime)result;
        }

        //Hàm này lấy ra ngày thanh lý trong csdl, nếu không có thì trả về new DateTime()
        public static DateTime getNgayThanhLy(int cap, int id)
        {
            object result = null;

            if (clsLicense.checkLicense())
            {
                SqlConnection conn = new SqlConnection(BienTc.connString);
                SqlCommand cmd = new SqlCommand("proc_getNgayThanhLy_NgayRutTC", conn);
                cmd.CommandType = CommandType.StoredProcedure;
                cmd.Parameters.AddWithValue("@fieldName", "Ngay_ThanhLy");
                cmd.Parameters.AddWithValue("@Cap", cap);
                cmd.Parameters.AddWithValue("@ID", id);
                conn.Open();
                result = cmd.ExecuteScalar();
            }

            if (result == DBNull.Value) return new DateTime();
            else return (DateTime)result;
        }

        #region isDuplicate (3 overload)
        //Hàm này kiểm tra xem giá trị fieldValue của trường fieldName của bảng tableName có bị trùng hay không
        //Sử dụng khi thêm dữ liệu
        public static bool isDuplicate(string fieldName, string fieldValue, string tableName)
        {
            bool isDuplicate = false;

            if (clsLicense.checkLicense())
            {
                SqlConnection conn = new SqlConnection(BienTc.connString);
                string commandText = "SELECT COUNT(" + fieldName + ") FROM " + tableName + " WHERE " + fieldName + "='" + fieldValue + "'";
                SqlCommand cmd = new SqlCommand(commandText, conn);
                conn.Open();
                string result = cmd.ExecuteScalar().ToString();
                if (result != "0") isDuplicate = true;
            }

            return isDuplicate;
        }

        //Hàm này kiểm tra xem giá trị fieldValue của trường fieldName của bảng tableName có bị trùng hay không
        //Sử dụng khi sửa dữ liệu
        public static bool isDuplicate(string fieldName, string fieldValue, string tableName, int id)
        {
            bool isDuplicate = false;

            if (clsLicense.checkLicense())
            {
                SqlConnection conn = new SqlConnection(BienTc.connString);

                string commandText = "";
                if (fieldName.ToUpper() == "SOPHIEUTHU")
                {
                    if (tableName.ToUpper() == "LAIXUAT_CB")
                        commandText = "SELECT COUNT(" + fieldName + ") FROM " + tableName + " WHERE " + fieldName + "='" + fieldValue + "' and DMCanBoID<>" + id;
                    else
                        commandText = "SELECT COUNT(" + fieldName + ") FROM " + tableName + " WHERE " + fieldName + "='" + fieldValue + "' and HopDongID<>" + id;
                }
                else commandText = "SELECT COUNT(" + fieldName + ") FROM " + tableName + " WHERE " + fieldName + "='" + fieldValue + "' and ID<>" + id;
                
                
                SqlCommand cmd = new SqlCommand(commandText, conn);
                conn.Open();
                string result = cmd.ExecuteScalar().ToString();
                if (result != "0") isDuplicate = true;
            }

            return isDuplicate;
        }

        //Hàm này kiểm tra xem giá trị fieldValue của trường fieldName của bảng tableName có bị trùng hay không
        //Sử dụng khi sửa dữ liệu
        public static bool isDuplicate(int cap, string madt, string fieldName, string fieldValue, string tableName)
        {
            bool isDuplicate = false;

            if (clsLicense.checkLicense())
            {
                SqlConnection conn = new SqlConnection(BienTc.connString);
                string commandText = "";
                if (cap == 1)
                {
                    if (tableName.ToUpper() == "DMCANBO")
                        commandText = "Select count(" + fieldName + ") from " + tableName +
                            " where Ma_DT <> '" + madt + "' and " + fieldName + " = '" + fieldValue + "'";
                    else if (tableName.ToUpper() == "LAIXUAT_CB")
                        commandText = "Select count(" + fieldName + ") from " + tableName +
                            " where Ma_CB <> '" + madt + "' and " + fieldName + " = '" + fieldValue + "'";
                }
                else
                {
                    commandText = "Select count(" + fieldName + ") from " + tableName +
                        " where Ma_DaiLy <> '" + madt + "' and " + fieldName + " = '" + fieldValue + "'";
                }
                SqlCommand cmd = new SqlCommand(commandText, conn);
                conn.Open();
                string result = cmd.ExecuteScalar().ToString();
                if (result != "0") isDuplicate = true;
            }

            return isDuplicate;
        }
        #endregion

        #region Các hàm sau sử dụng chung cho frmTLChiTiet, rptMauTC01A, rptMauTC04A để tự động tính toán giá trị một số cột
        //Ngoài ra hàm setTienGocDauKy còn sử dụng cho frmTLDaiLy

        //Hàm này thêm các cột TienGocDauKy, Tien_lai, TienGocMoi vào dt và điền giá trị cho chúng
        public static void XyLyNguon (int cap, int id, DateTime NgayTLy, DateTime NgayRutTC, ref DataTable dt, int i, int mode)
        {
            if (clsLicense.checkLicense())
            {
                SqlConnection conn = new SqlConnection(BienTc.connString);
                conn.Open();

                // Tính giá trị cho cột TienGocDauKy
                decimal tiengocdauky, lx, tienlai;
                if (i == 0) //Dòng 0 là kỳ đầu tiên
                {
                    //Thêm các cột TienGocDauKy, Tien_lai, TienGocMoi vào dt
                    dt.Columns.Add("TienGocDauKy", Type.GetType("System.Decimal"));
                    dt.Columns.Add("Tien_lai", Type.GetType("System.Decimal"));
                    dt.Columns.Add("TienGocMoi", Type.GetType("System.Decimal"));

                    //Lấy ra tiền gốc đã nộp thế chấp, đây cũng chính là số tiengocdauky của kỳ đầu tiên
                    tiengocdauky = clsCommon.setTienGocDauKy(cap, id, (DateTime)dt.Rows[0]["Tu_Ngay"]);
                }
                else //nếu là kỳ thứ 2 trở đi thì tiengocdauky là số TienGocMoi của kỳ trước đó (tức là gốc + lãi của kỳ liền trước)
                {
                    tiengocdauky = (decimal)dt.Rows[i - 1]["TienGocMoi"];
                }
                dt.Rows[i]["TienGocDauKy"] = tiengocdauky;

                // Tính lãi xuất
                lx = (decimal)dt.Rows[i]["Lai_Xuat"] / 100;

                // Tính số ngày hưởng lãi của kỳ, đồng thời thực hiện một số thay đổi với dt
                int songay = clsCommon.soNgayHuongLai(NgayTLy, NgayRutTC, ref dt, i, mode);

                //Tính Tien_lai và TienGocMoi
                tienlai = (((tiengocdauky * lx) / 360)) * (songay);
                dt.Rows[i]["Tien_lai"] = tienlai;
                dt.Rows[i]["TienGocMoi"] = tiengocdauky + tienlai;
            }
        }

        //Sử dụng để cài đặt tiền gốc đầu kỳ cho frmTLChiTiet, rptMauTC01A, rptMauTC04A
        public static decimal setTienGocDauKy(int capDL, int id, DateTime TuNgay)
        {
            DataTable dt2 = new DataTable();

            if (clsLicense.checkLicense())
            {
                SqlConnection conn = new SqlConnection(BienTc.connString);
                conn.Open();

                //Thủ tục này lấy ra tiền gốc đã nộp thế chấp, đây cũng chính là số tiengocdauky của kỳ đầu tiên
                string sql = "proc_setTienGocDauKy";
                SqlDataAdapter da = new SqlDataAdapter(sql, conn);
                da.SelectCommand.CommandType = CommandType.StoredProcedure;
                da.SelectCommand.Parameters.Clear();
                da.SelectCommand.Parameters.AddWithValue("@Cap", capDL);
                da.SelectCommand.Parameters.AddWithValue("@ID", id);
                da.Fill(dt2);
            }

            if (dt2.Rows[0][0] == DBNull.Value) return 0;
            else return (decimal)dt2.Rows[0][0];
        }

        //Tính số ngày hưởng lãi của kỳ và thực hiện một số thay đổi với dt
        static int soNgayHuongLai(DateTime NgayTLy, DateTime NgayRutTC, ref DataTable dt, int i, int mode)
        {
            TimeSpan ts = new TimeSpan();

            if (clsLicense.checkLicense())
            {
                DateTime DenNgay = ((DateTime)dt.Rows[i]["Den_Ngay"]);
                DateTime TuNgay = ((DateTime)dt.Rows[i]["Tu_Ngay"]).Date;

                if (NgayTLy.Date == new DateTime().Date || mode == 1) //<=> Nếu ngày thanh lý rỗng (có nghĩa là đại lý chưa thanh lý) hoặc là mode công ty => tính lãi bình thường)
                {
                    ts = DenNgay.Date - TuNgay.Date;
                }
                else    //<=> mode đại lý và đại lý thanh lý (nhưng có thể là đã rút thế chấp hoặc chưa rút thế chấp)
                {
                    //Xác định kỳ đang xét có phải là kỳ chữa ngày hẹn rút (gọi là kỳ x)
                    //- Nếu là kỳ x thì rồi loại bỏ các kỳ sau kỳ x (nếu có) và tính số ngày hưởng lãi của kỳ x (tùy thuộc vào đã rút hay chưa và rút có đúng hẹn hay không)
                    //- Nếu là chưa phải là kỳ x thì vẫn tính số ngày hưởng lãi bình thường
                    //==================================================================================

                    DateTime ngayhenrut = NgayTLy.AddDays(30);

                    //Biểu thức so sánh này giúp xác định kỳ này có phải kỳ x
                    if (ngayhenrut.Date >= TuNgay.Date && ngayhenrut.Date <= DenNgay.Date) //nếu đúng là kỳ x (thì cài đặt lại "Den_Ngay")
                    {
                        //Bỏ đi các kỳ sau kỳ x (nếu có)
                        if ((i + 1) < dt.Rows.Count)
                            for (int j = (i + 1); j < dt.Rows.Count; j++) dt.Rows.RemoveAt(j);

                        //Tính số ngày hưởng lãi trong kỳ x
                        if (NgayRutTC.Date == new DateTime().Date) //<=> Nếu NgayRutTC rỗng (=> đại lý thanh lý chưa rút thế chấp => tính lãi đến ngày hẹn rút)
                        {
                            dt.Rows[i]["Den_Ngay"] = ngayhenrut.Date;
                        }
                        else //<=> Nếu đại lý thanh lý đã rút thế chấp thì...
                        // - ... nếu rút trước hoặc đúng ngày hẹn thì tính đến ngày rút
                        // - ... nếu rút sau ngày hẹn thì tính đến ngày hẹn
                        {
                            if (NgayRutTC.Date <= ngayhenrut.Date)  //<=> rút trước hoặc đúng hẹn
                            {
                                dt.Rows[i]["Den_Ngay"] = NgayRutTC.Date;
                                DenNgay = NgayRutTC.Date;
                            }
                            else
                            {
                                dt.Rows[i]["Den_Ngay"] = ngayhenrut.Date;
                                DenNgay = ngayhenrut.Date;
                            }
                        }
                    }

                    ts = DenNgay.Date - TuNgay.Date;
                }
            }

            return (int)ts.TotalDays;
        }
        #endregion


        /// <summary>
        /// Hàm này trả về một phần source cho gv ở frmTLChitiet, frmTLDaiLy, frmRptBangTheoDoi, rptMauTC01A. Gồm các cột:
        /// <para>- Cap 1: T.DMCanBoID, CB.Tien_Goc AS Tien, Ky, Lai_xuat, LoaiKyHan (sắp xếp tăng dần theo Ky);</para>
        /// <para>- Cap 2: T.HopDongID, HD.So_Tien as Tien, Ky, Lai_xuat, LoaiKyHan (sắp xếp tăng dần theo Ky).</para>
        /// </summary>
        /// <param name="cap">Cấp đại lý</param>
        /// <param name="id">TLLX1.DMCanBoID hoặc TLLX2.HopDongID</param>
        /// <returns></returns>
        public static DataTable loadDataSource_TLLX(int cap, int id)
        {
            DataTable dt = new DataTable();

            if (clsLicense.checkLicense())
            {
                SqlConnection conn = new SqlConnection(BienTc.connString);
                conn.Open();

                //Cap 1: T.DMCanBoID, CB.Tien_Goc AS Tien, Ky, Lai_xuat, LoaiKyHan (sắp xếp tăng dần theo Ky)
                //Cap 2: T.HopDongID, HD.So_Tien as Tien, Ky, Lai_xuat, LoaiKyHan (sắp xếp tăng dần theo Ky)
                SqlDataAdapter da = new SqlDataAdapter("proc_TLLX", conn);
                da.SelectCommand.CommandType = CommandType.StoredProcedure;
                da.SelectCommand.Parameters.AddWithValue("@Cap", cap);
                da.SelectCommand.Parameters.AddWithValue("@ID", id);

                da.Fill(dt);

                //Thêm cột Tu_ngay, Den_Ngay vào dt và diền giá trị cho chúng
                dt.Columns.Add("Tu_ngay", Type.GetType("System.DateTime"));
                dt.Columns.Add("Den_Ngay", Type.GetType("System.DateTime"));
                if (dt.Rows.Count > 0)
                {
                    DateTime TuNgay = new DateTime();
                    DateTime DenNgay = new DateTime();

                    for (int i = 0; i < dt.Rows.Count; i++)
                    {
                        if (i == 0) TuNgay = generateNgayBDTL(cap, id);
                        else TuNgay = DenNgay;
                        DenNgay = generateDenNgay(Convert.ToInt32(dt.Rows[i]["LoaiKyHan"]), TuNgay);

                        dt.Rows[i]["Tu_ngay"] = TuNgay.Date;
                        dt.Rows[i]["Den_Ngay"] = DenNgay.Date;
                    }
                }
            }

            return dt;
        }

        public static void addTuNgay_DenNgay(int cap, int id, ref DataTable dt)
        {
            if (clsLicense.checkLicense())
            {
                //Thêm cột Tu_ngay vào dt và diền giá trị cho nó
                dt.Columns.Add("Tu_ngay", Type.GetType("System.DateTime"));
                dt.Columns.Add("Den_Ngay", Type.GetType("System.DateTime"));
                if (dt.Rows.Count > 0)
                {
                    DateTime TuNgay = new DateTime();
                    DateTime DenNgay = new DateTime();

                    for (int i = 0; i < dt.Rows.Count; i++)
                    {
                        if (i == 0) TuNgay = generateNgayBDTL(cap, id);
                        else TuNgay = DenNgay;
                        DenNgay = generateDenNgay(Convert.ToInt32(dt.Rows[i]["LoaiKyHan"]), TuNgay);

                        dt.Rows[i]["Tu_ngay"] = TuNgay.Date;
                        dt.Rows[i]["Den_Ngay"] = DenNgay.Date;
                    }
                }
            }
        }

        /// <summary>
        /// Hàm này dùng tại frmRptBangTheoDoi, rptMauTC01A
        /// </summary>
        /// <param name="cap">Cấp đại lý</param>
        /// <param name="dt">dt chứa các DMCanBoID (hoặc HopDongID) xuất hiện trong bảng TLLX1 (hoặc TLLX2)</param>
        /// <returns></returns>
        public static DataTable loadData_TienKyQuy(this int cap, DataTable dt)
        {
            //dt sau chứa các kỳ lãi đã gửi của đại lý tương ứng với id
            DataTable dt2 = new DataTable();

            if (clsLicense.checkLicense())
            {
                if (dt.Rows.Count > 0)
                {
                    int id=-1;
                    DataTable dtTemp = new DataTable();
                    for (int i = 0; i < dt.Rows.Count; i++)     //Lặp lấy ra bảng lãi chi tiết của tương ứng với id thứ i và đưa vào dt2
                    {
                        if (i == 0)
                        {
                            if (cap == 1) id = (int)dt.Rows[i]["DMCanBoID"];
                            else id = (int)dt.Rows[i]["HopDongID"];
                            dt2 = clsCommon.loadDataSource_TLLX(cap, id);
                        }
                        else //if (i > 0)
                        {
                            int ma;
                            if (cap == 1) ma = (int)dt.Rows[i]["DMCanBoID"];
                            else ma = (int)dt.Rows[i]["HopDongID"];
                            if (ma == id) i++;
                            else
                            {
                                if (cap == 1) id = (int)dt.Rows[i]["DMCanBoID"];
                                else id = (int)dt.Rows[i]["HopDongID"];

                                //dt sau chứa các kỳ lãi đã gửi của đại lý tương ứng với id
                                dtTemp = clsCommon.loadDataSource_TLLX(cap, id);
                                if (dtTemp.Rows.Count > 0)
                                    for (int j = 0; j < dtTemp.Rows.Count; j++)
                                    {
                                        dt2.ImportRow(dtTemp.Rows[j]);
                                    }
                            }
                        }
                    }
                }
            }

            return dt2;
        }

        public static DataTable CopyToDataTable<T>(this IEnumerable<T> source)
        {
            return new ObjectShredder<T>().Shred(source, null, null);
        }

        public static DataTable CopyToDataTable<T>(this IEnumerable<T> source, DataTable table, LoadOption? options)
        {
            return new ObjectShredder<T>().Shred(source, table, options);
        }

        public static int ToInt32(this object o)
        {
            return Convert.ToInt32(o == DBNull.Value ? 0 : o);
        }

        public static bool formIsNotExisting(string frmName)
        {
            bool exist = false;

            if (Application.OpenForms[frmName] == null)
            {
                exist = true;
            }

            return exist;
        }

    }
}
